import { useMenuStore } from '@/stores/menu'
import router from '@/router'

/**
 * 菜单及功能权限hooks
 * @returns
 */
export function useAuth() {
  const menuStore = useMenuStore()

  /**
   * 判断是否具有权限
   * @param funcKey 权限标识
   * @param menuId 可选参数, 可以指定menuId, 如果不指定获取当前页面路由
   * @returns boolean
   */
  const hasFuncKey = (funcKey: string, menuId?: string) => {
    if (!funcKey) {
      return true
    }

    let currentFuncKeys: string[] = []
    if (menuId) {
      currentFuncKeys = menuStore.menuIndex[menuId]?.funcKeys
    } else {
      const currentRoute = router.currentRoute.value
      currentFuncKeys = currentRoute.meta?.funcKeys as string[]
    }
    const has = currentFuncKeys.includes(funcKey)

    return has
  }

  /**
   * 判断权限数组是否每一个都具有权限
   * @param funcKeys 权限标识
   * @param menuId 可选参数, 可以指定menuId, 如果不指定获取当前页面路由
   * @returns boolean
   */
  const hasEveryFuncKeys = (funcKeys: string[], menuId?: string) => {
    if (!funcKeys || funcKeys.length == 0) {
      return true
    } else if (funcKeys.length == 1) {
      return hasFuncKey(funcKeys[0], menuId)
    } else {
      return funcKeys.every(fk => hasFuncKey(fk, menuId))
    }
  }

  /**
   * 判断权限数组是否至少有一个都具有权限
   * @param funcKeys 权限标识
   * @param menuId 可选参数, 可以指定menuId, 如果不指定获取当前页面路由
   * @returns boolean
   */
  const hasSomeFuncKeys = (funcKeys: string[], menuId?: string) => {
    if (!funcKeys || funcKeys.length == 0) {
      return true
    } else if (funcKeys.length == 1) {
      return hasFuncKey(funcKeys[0], menuId)
    } else {
      return funcKeys.some(fk => hasFuncKey(fk, menuId))
    }
  }

  /**
   * 判断权限数组, 返回具有权限的数量
   * @param funcKeys 权限标识
   * @param menuId 可选参数, 可以指定menuId, 如果不指定获取当前页面路由
   * @returns number
   */
  const hasFuncKeysCount = (funcKeys: string[], menuId?: string) => {
    if (!funcKeys || funcKeys.length == 0) {
      return 0
    } else if (funcKeys.length == 1) {
      return hasFuncKey(funcKeys[0], menuId) ? 1 : 0
    } else {
      return funcKeys.filter(fk => hasFuncKey(fk, menuId)).length
    }
  }

  /**
   * 判断是否具有菜单权限
   * @param menuId
   * @returns
   */
  const hasMenu = (menuId: string) => {
    const has = menuStore.menuIndex[menuId]
    return has ? true : false
  }

  return { hasFuncKey, hasEveryFuncKeys, hasSomeFuncKeys, hasFuncKeysCount, hasMenu }
}
